package com.slofzx.nuoda.evaluation.project.service.impl;

import com.slofzx.nuoda.common.config.Type;
import com.slofzx.nuoda.common.enums.CommonResultEnum;
import com.slofzx.nuoda.common.enums.ServiceResult;
import com.slofzx.nuoda.common.exception.ServiceException;
import com.slofzx.nuoda.common.feign.RoleClient;
import com.slofzx.nuoda.common.vo.PermissionVO;
import com.slofzx.nuoda.common.vo.SysUserVO;
import com.slofzx.nuoda.custom.template.dto.TemplateInfoDTO;
import com.slofzx.nuoda.custom.template.entity.TemplateInfo;
import com.slofzx.nuoda.custom.template.service.impl.TemplateServiceImpl;
import com.slofzx.nuoda.custom.template.vo.TemplateInfoVO;
import com.slofzx.nuoda.evaluation.project.dao.SysTemplateInfoDAO;
import com.slofzx.nuoda.evaluation.project.dto.ExportTemplateDetailDTO;
import com.slofzx.nuoda.evaluation.project.dto.ExportTemplateInfoDTO;
import com.slofzx.nuoda.evaluation.project.entity.ExportTemplateInfo;
import com.slofzx.nuoda.evaluation.project.enums.DateFormatType;
import com.slofzx.nuoda.evaluation.project.enums.TemplateTypeEnum;
import com.slofzx.nuoda.evaluation.project.service.ExportTemplateDetailService;
import com.slofzx.nuoda.evaluation.project.service.ExportTemplateInfoService;
import com.slofzx.nuoda.evaluation.project.util.BusiUtil;
import com.slofzx.nuoda.evaluation.project.util.CglibUtils;
import com.slofzx.nuoda.evaluation.project.vo.ExportTemplateInfoVO;
import com.slofzx.nuoda.evaluation.steretype.ExcelExportItemLoader;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;

/**
 * 模版信息表服务实现类
 *
 * @author nuoda
 * @since 2024-02-21 10:03:01
 */
@Service("exportTemplateInfoService")
@Primary
public class ExportTemplateInfoServiceImpl extends TemplateServiceImpl implements ExportTemplateInfoService {

    @Resource
    private SysTemplateInfoDAO sysTemplateInfoDAO;

    @Autowired
    private ExcelExportItemLoader excelExportItemLoader;
    @Autowired
    private ExportTemplateDetailService exportTemplateDetailService;
    @Override
    protected SysTemplateInfoDAO getTemplateDAO() {
        return this.sysTemplateInfoDAO;
    }

    @Override
    public List<ExportTemplateInfoVO> queryList(ExportTemplateInfoDTO dto) {
        List<ExportTemplateInfoVO> result = new ArrayList<>();
        final SysUserVO user = getUser();
        if (TemplateTypeEnum.CUSTOM.getId().equals(dto.getType())) {
            dto.setCreateUser(user.getId());
        } else {
            final List<PermissionVO> permissionList = user.getPermissionList();
            // 不是超级管理员且没有系统模板修改权限只能查看发布的模板
            if (!user.isAdmin()) {
                if (CollectionUtils.isEmpty(permissionList)) {
                    dto.setPublish(true);
                } else {
                    final List<String> permissionIdList = permissionList.stream().map(PermissionVO::getId).collect(Collectors.toList());
                    if (!permissionIdList.contains("system_template:update")) {
                        dto.setPublish(true);
                    }
                }


            }
        }

        final List<ExportTemplateInfo> list = getTemplateDAO().queryList(dto);

        if (CollectionUtils.isEmpty(list)) {
            return result;
        }
        for (ExportTemplateInfo templateInfo : list) {
            final ExportTemplateInfoVO exportTemplateInfoVO = parseEntity2VO(templateInfo);
            result.add(exportTemplateInfoVO);
        }
        return result;
    }

    protected ExportTemplateInfoVO parseEntity2VO(ExportTemplateInfo entity) {
        ExportTemplateInfoVO vo = new ExportTemplateInfoVO();
        vo.setId(entity.getId());
        vo.setCreateTime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(entity.getCreateTime()));
        if (entity.getPublishTime() != null) {
            vo.setPublishTime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(entity.getPublishTime()));
        }

        vo.setName(entity.getName());
        vo.setTag(entity.getTag());
        vo.setType(entity.getType());
        vo.setRemark(entity.getRemark());
        vo.setPublish(entity.isPublish());
        vo.setCreateUser(entity.getCreateUser());
        vo.setExportTemplateType(entity.getExportTemplateType());

        return vo;
    }

    @Override
    public List<Type> queryFieldList(ExportTemplateInfoDTO dto) {
        List<Type> resultList = new ArrayList<>();
//        resultList.addAll(Arrays.asList(ProjectInputItemEnum.values()));
        resultList.addAll(excelExportItemLoader.getDataList());
        return resultList;
    }

    @Override
    @Transactional
    public ServiceResult createTemplate(ExportTemplateInfoDTO dto){
        if (StringUtils.isEmpty(dto.getTag())) {
            throw new ServiceException("产品类型不允许为空","产品类型不允许为空",null);
        }
        if (StringUtils.isEmpty(dto.getType())) {
            throw new ServiceException("模版类型不允许为空","模版类型不允许为空",null);
        }
        final String oldTemplateId = dto.getSourceId();

        final ServiceResult result = super.createTemplate(dto);
        // 复制自定义分组信息 必须创建完模板后才能复制这样才能拿到新模板的ID
        if (StringUtils.isNotEmpty(oldTemplateId)) {
            exportTemplateDetailService.copy(oldTemplateId,dto.getId());
        }
        ExportTemplateInfo entity = new ExportTemplateInfo();
        entity.setId(dto.getId());
        entity.setExportTemplateType(dto.getExportTemplateType());
        sysTemplateInfoDAO.updateExportTemplateType(entity);
        return result;
    }

    @Override
    public ServiceResult cancelPublish(ExportTemplateDetailDTO dto) {
        final TemplateInfo templateInfo = sysTemplateInfoDAO.selectById(dto.getId());
        templateInfo.setPublish(false);
        sysTemplateInfoDAO.updateById(templateInfo);
        return CommonResultEnum.SUCCESS;
    }
}
